MD5 因為其不可逆的特性, 讓它成為現今許多工程師常用的加密方式之一
尤其在這隱私權高漲的年代, 所有個資, 卡號, 交易金流相關都會用到加密
來看個簡單的範例
public static void main(String[] args){
String str = "helloJava"; //要加密的字串
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(str.getBytes("UTF-8"));
//Hash計算, 產生128位的長整數
byte[] bytes = messageDigest.digest();
StringBuffer sb = new StringBuffer(bytes.length * 2);
for(Byte b : bytes){
//右移四位, 取字節中前四位轉換
sb.append(hexDigits[(b >> 4) & 0x0f]);
//取字節中後四位轉換
sb.append(hexDigits[b & 0x0f]);
}
//輸出 602965cf9dd0e80ca28269257a6aba87
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
網路上有看到MD5有分32位元跟16位元, 是什麼意思呢?
其實MD5的長度原生為128bit, 也就是128個0跟1組合
但這樣的方式不易閱讀, 所以我們會轉成16進制, 每4個bit表示1個16進制
所以 128/4 = 32, 就變32位元了, 這也是大部分人用的方法。
那16位元是怎麼來的?
16位元是去掉前8位, 後8位得到的, 所以16位元的數值會跟32位元的中間部分一樣。
MD5 32位元 = 602965cf9dd0e80ca28269257a6aba87
MD5 16位元 = 9dd0e80ca2826925